from django.shortcuts import render,redirect
from django.http import HttpResponse,JsonResponse
from django.template import loader,RequestContext
from booktest.models import BookInfo,HeroInfo,AreaInfo
from booktest.models import User
from datetime import date
from django.utils.dateparse import parse_date
from django.http import HttpResponseRedirect
from django.conf import settings
from django.core.paginator import Paginator

def login_required(view_func):
    '''登录判断装饰器'''
    def wrapper(request, *view_args, **view_kwargs):
        # 判断用户是否登录
        if request.session.has_key('islogin'):
            # 用户已登录,调用对应的视图
            return view_func(request, *view_args, **view_kwargs)
        else:
            # 用户未登录,跳转到登录页
            return redirect('/login')
    return wrapper
#首页，展示所有图书
#@login_required
def index(request):
    # 查询所有图书
    booklist = BookInfo.objects.all()
    # 将图书列表传递到模板中，然后渲染模板
    return render(request, 'booktest/index.html', {'booklist': booklist,'str':str})

#详细页，接收图书的编号，根据编号查询，再通过关系找到本图书的所有英雄并展示
def detail(request, bid):
    #根据图书编号对应图书
    book = BookInfo.objects.get(id=int(bid))
   # list = BookInfo.objects.filter(id__exact=1);
    #book = list[0];
    #查找book图书中的所有英雄信息
    heros = book.heroinfo_set.all()
   # heros = HeroInfo.objects.filter()
    #将图书信息传递到模板中，然后渲染模板
    return render(request, 'booktest/detail.html', {'book':book,'heros':heros})

#保存图书
def saveBookInfo(request):
    #获取表单参数
    btitle = request.POST.get('btitle')
    bdate = request.POST.get('bpub_date')

    book=BookInfo()
    book.btitle = btitle
    book.bpub_date = parse_date(bdate) #字符串格式的时间和日期转化为日期和时间对象
    book.save()
    #转向到首页
    return redirect('/index')
#保存图书
def updateBookInfo(request):
    book = BookInfo.objects.get(id=int(request.POST.get('id')))

    btitle = request.POST.get('btitle')
    bdate = request.POST.get('bpub_date')

    book.btitle = btitle
    book.bpub_date = parse_date(bdate)  # 字符串格式的时间和日期转化为日期和时间对象
    book.save()
    #转向到首页
    return redirect('/index')

def createview(request):
    #将图书信息传递到模板中，然后渲染模板
    return render(request, 'booktest/createview.html')

def updateview(request,id):
    book = BookInfo.objects.get(id=int(id))
    return render(request, 'booktest/updateview.html',{"book":book})
#逻辑删除指定编号的图书
def delete(request,id):
    book=BookInfo.objects.get(id=int(id))
    book.delete()
    #转向到首页
    return redirect('/index')

#查询南昌市的信息
def area(request):
    area = AreaInfo.objects.get(pk=360100) #广州市 440100
    return render(request, 'booktest/area.html', {'area': area})


#HttpReqeust对象属性
def request_attr(request):
    # path：一个字符串，表示请求的页面的完整路径，不包含域名和参数部分。
    # method：一个字符串，表示请求使用的HTTP方法，常用值包括：'GET'、'POST'
    # encoding: 一个字符串，表示提交的数据的编码方式
    #s = 1/0
    str='%s,%s,%s'%(request.path,request.method,request.encoding)
    return render(request, 'booktest/request_attr.html', {'str': str})
    
#HttpReqeust对象提交方式
def method_show(request):
    return HttpResponse(request.method)

def show_arg(request, num):
    return HttpResponse(num)

def show_fm(request):
    return render(request, 'booktest/show_fm.html', {})
#接收请求参数
def show_reqarg(request):
    if request.method == 'GET':
        a = request.GET.get('a') #获取请求参数a
        b = request.GET.get('b') #获取请求参数b
        c = request.GET.get('c') #获取请求参数c

        a2 = request.GET['a']
        b2 = request.GET['b']
        c2 = request.GET['c']
        return render(request, 'booktest/show_form1.html', {'a':a, 'b':b, 'c':c,'a2':a2,'b2':b2,'c2':c2})
    else:
        name = request.POST.get('uname') #获取name
        gender = request.POST.get('gender') #获取gender
        hobbys = request.POST.getlist('hobby') #获取hobby

        return render(request, 'booktest/show_form2.html', {'name':name, 'gender':gender, 'hobbys':hobbys})

def json1(request):
    return render(request,'booktest/json1.html')

def json2(request):
    return JsonResponse({'h1':'hello','h2':'world'})

# 定义重定义向视图，转向首页
def red1(request):
    return HttpResponseRedirect('/json1/')
    #return redirect('/json1/')

def login(request):
    '''显示登录页面'''
    # 判断用户是否登录
    if request.session.has_key('islogin'):
        # 用户已登录, 跳转到首页
        return redirect('/index')
    else:
        # 用户未登录
        # 获取cookie username
        if 'username' in request.COOKIES:
            # 获取记住的用户名
            username = request.COOKIES['username']
        else:
            username = ''

        return render(request, 'booktest/login.html', {'username':username})

def login_out(request):
   # del request.session['islogin']
    request.session.flush()
    return redirect('/login')

def login_check(request):
    '''登录校验视图'''
    # request.POST 保存的是post方式提交的参数 QueryDict
    # request.GET 保存是get方式提交的参数
    print(request.method)
    # 1.获取提交的用户名和密码
    username = request.POST.get('username')
    password = request.POST.get('password')
    remember = request.POST.get('remember')
    # 2.进行登录的校验
    # 实际开发:根据用户名和密码查找数据库
    # 模拟: smart 123
    if username == 'admin' and password == '123':
        # 用户名密码正确，跳转到首页
        response = redirect('/index')

        # 判断是否需要记住用户名
        if remember == 'on':
            # 设置cookie username，过期时间1周
            response.set_cookie('username', username, max_age=7*24*3600)

        # 记住用户登录状态
        # 只有session中有islogin,就认为用户已登录
        request.session['islogin'] = True

        # 返回应答
        return response
    else:
        # 用户名或密码错误，跳转到登录页面
        return redirect('/login')

    #数据库版本用户表验证
    u = User.objects.filter(uname__exact=username,upassword__exact=password)


# /test_ajax
def ajax_test(request):
    '''显示ajax页面'''
    return render(request, 'booktest/test_ajax.html')


def ajax_handle(request):
    '''ajax请求处理'''
    # 返回的json数据 {'res':1}
    return JsonResponse({'res':1})


# /login_ajax
def login_ajax(request):
    '''显示ajax登录页面'''
    return render(request, 'booktest/login_ajax.html')


# /login_ajax_check
def login_ajax_check(request):
    '''ajax登录校验'''
    # 1.获取用户名和密码
    username = request.POST.get('username')
    password = request.POST.get('password')

    # 2.进行校验,返回json数据
    if username == 'admin' and password == '123':
        # 用户名密码正确
        return JsonResponse({'res':1})
        # return redirect('/index') ajax请求在后台，不要返回页面或者重定向
    else:
        # 用户名或密码错误
        return JsonResponse({'res':0})


# /set_cookie
def set_cookie(request):
    '''设置cookie信息'''
    response = HttpResponse('设置cookie')
    # 设置一个cookie信息,名字为num, 值为1
    
    #1. 若没有填写 max_age, expires ,默认都为None
    #此时该cooike为临时的,只存在浏览器内存中, 关闭浏览器则自动删除
    #2. 只有max_age,  则按秒计算过期时间, 浏览器会存在本地缓存路径, 并自动删除过期cookie
    #3. 只有expires,  则按照时间字符串计算过期时间, 浏览器会存在本地缓存路径, 自动删除过期cookie
    #3. 若 max_age和 expires 同时存在,  则默认使用 max_age
    #4. 如果设置的cookie时间小于计算机时间, 浏览器则不提取cookie
    #response.set_cookie('num', 1, max_age=14*24*3600)
    response.set_cookie('num', 2)
    # response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14))
    # 返回response
    return response


# /get_cookie
def get_cookie(request):
    '''获取cookie的信息'''
    # 取出cookie num的值
    num = request.COOKIES['num']
    return HttpResponse(num)


# /set_session
def set_session(request):
    '''设置session'''
    #set_expiry(value)： 设置cookie的有效期。可以传递不同类型的参数值：
    #如果值是一个整数，session将在对应的秒数后失效。例如request.session.set_expiry(300) 将在300秒后失效.
    request.session['username'] = '张三'
    request.session['age'] = 18
    #request.session.set_expiry(600)
    return HttpResponse('设置session')


# /get_session
def get_session(request):
    '''获取session'''
    username = request.session['username']
    age = request.session['age']
    return HttpResponse(username+':'+str(age))


#　/clear_session
def clear_session(request):
    '''清除session信息'''
    #request.session.clear()
    request.session.flush()
    return HttpResponse('清除成功')









# /temp_var
def temp_var(request):
    '''模板变量'''
    my_dict = {'title':'字典键值'}
    my_list = [1,2,3]
    book = BookInfo.objects.get(id=2)
    # 定义模板上下文
    context = {'my_dict':my_dict, 'my_list':my_list, 'book':book}
    return render(request, 'booktest/temp_var.html', context)


# /temp_tags
def temp_tags(request):
    '''模板标签'''
    # 1. 查找所有图书的信息
    books = BookInfo.objects.all()
    return render(request,'booktest/temp_tags.html', {'books':books})


# /temp_filter
def temp_filter(request):
    '''模板过滤器'''
    # 1. 查找所有图书的信息
    books = BookInfo.objects.all()
    return render(request,'booktest/temp_filter.html', {'books':books,'content':'张三'})


# /temp_inherit
def temp_inherit(request):
    '''模板继承'''
    return render(request, 'booktest/child.html')


# /html_escape
def html_escape(request):
    '''html转义'''
    return render(request, 'booktest/html_escape.html', {'content':'<h1>hello</h1>'})

# /change_pwd
@login_required
def change_pwd(request):
    '''显示修改密码页面'''
    # # 进行用户是否登录的判断
    # if not request.session.has_key('islogin'):
    #     # 用户未登录，跳转到登录
    #     return redirect('/login')

    return render(request, 'booktest/change_pwd.html')


# /change_pwd_action
@login_required
def change_pwd_action(request):
    '''模拟修改密码处理'''
    # # 进行用户是否登录的判断
    # if not request.session.has_key('islogin'):
    #     # 用户未登录，跳转到登录
    #     return redirect('/login')

    # 1.获取新密码
    pwd = request.POST.get('pwd')
    # 获取用户名
    username = request.session.get('username')
    # 2.实际开发的时候: 修改对应数据库中的内容...
    # 3.返回一个应答
    return HttpResponse('%s修改密码为:%s'%(username,pwd))


'''
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO

# /verify_code
def verify_code(request):
    # 引入随机函数模块
    import random
    # 定义变量，用于画面的背景色、宽、高 RGB
    bgcolor = (random.randrange(20, 100), random.randrange(
        20, 100), 255)
    width = 100
    height = 25
    # 创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    # 创建画笔对象
    draw = ImageDraw.Draw(im)
    # 调用画笔的point()函数绘制噪点
    for i in range(0, 100):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        draw.point(xy, fill=fill)

    # 定义验证码的备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # 随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]

    # 构造字体对象，ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
    font = ImageFont.truetype('arial.ttf', 23)
    # 构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    # 绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    # 释放画笔
    del draw
    # 存入session，用于做进一步验证
    request.session['verifycode'] = rand_str
    # 内存文件操作
    buf = BytesIO()
    # 将图片保存在内存中，文件类型为png
    im.save(buf, 'png')
    # 将内存中的图片数据返回给客户端，MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')
'''

# /url_reverse
def url_reverse(request):
    '''url反向解析页面'''

    return render(request, 'booktest/url_reverse.html',{"p1":11113,"p2":111114})


def show_args(request, a, b):
    return HttpResponse(a+':'+b)


def show_kwargs(request, c, d):
    return HttpResponse(c+":"+d)


from django.urls import reverse
# /test_redirect
def test_redirect(request):
    # 重定向到/index
    # return redirect('/index')
    # url = reverse('booktest:index')

    # 重定向到/show_args/1/2
    # url = reverse('booktest:show_args', args=(1,2))

    # 重定向到/show_kwargs/3/4
    url = reverse('booktest:show_kwargs', kwargs={'c':3, 'd':4})
    return redirect(url)

#上传
def pic_upload(request):
    return render(request,'booktest/pic_upload.html')
def pic_handle(request):
    f1=request.FILES.get('pic')
    fname='%s/upload/%s'%(settings.STATICFILES_DIRS[0],f1.name)
    with open(fname,'wb') as pic:
        for c in f1.chunks():
            pic.write(c)
    return HttpResponse('OK')


#参数pIndex表示：当前要显示的页码
def page_test(request,pIndex):
    #查询所有的地区信息
    list1 = AreaInfo.objects.filter(aParent__isnull=True)
    #将地区信息按一页10条进行分页
    p = Paginator(list1, 10)
    #如果当前没有传递页码信息，则认为是第一页，这样写是为了请求第一页时可以不写页码
    if pIndex == '':
        pIndex = '1'
    #通过url匹配的参数都是字符串类型，转换成int类型
    pIndex = int(pIndex)
    #获取第pIndex页的数据
    list2 = p.page(pIndex)
    #获取所有的页码信息
    plist = p.page_range
    #将当前页码、当前页的数据、页码信息传递到模板中
    return render(request, 'booktest/page_test.html', {'list': list2, 'plist': plist, 'pIndex': pIndex})


def area1(request):
    return render(request,'booktest/area1.html')
#获取省信息
def area2(request):
    list = AreaInfo.objects.filter(aParent__isnull=True)
    list2 = []
    for item in list:
        list2.append([item.id, item.atitle])
    return JsonResponse({'data': list2})
#根据pid查询子级区域信息
def area3(request, pid):
    list = AreaInfo.objects.filter(aParent_id=pid)
    list2 = []
    for item in list:
        list2.append([item.id, item.atitle])
    return JsonResponse({'data': list2})